// 放登录注册接口

const db = require('../db');
// const utils = require('utility'); // { noop: fun..., try: fun..., md5: fun..., sha1: fun... }
let { md5 } = require('utility');
let jwt = require('jsonwebtoken');

// 1. 加载express
const express = require('express');
// 2. 创建路由对象，实则是个函数类型
const router = express.Router();


// 必须在这里，注册中间件，完成数据的验证
router.use((req, res, next) => {
  // 获取username和password
  let { username, password } = req.body;
  // 验证用户名
  if (!/^[a-zA-Z][0-9a-zA-Z_]{1,9}$/.test(username)) {
    next('用户名只能包含数组字母下划线，长度2~10位，字母开头');
  } else if (!/^\S{5,12}$/.test(password)) {
    next('密码6~12位且不能出现空格');
  } else {
    next();
  }
});

// 3. 写接口，把接口挂载到 router 上

/**
 * 注册接口
 * 请求方式：POST
 * 接口地址：/api/reguser
 * 请求体：username | password
 */
router.post('/reguser', (req, res) => {
  // 1. 接收客户端提交的数据
  // console.log(req.body); // { username: 'lisi890', password: '123456' }
  let { username, password } = req.body;
  // 加密密码
  password = md5(password);
  // 2. 判断用户名是否存在
  db(`select * from user where username='${username}'`, (e, r) => {
    if (e) throw e;
    // console.log(r);
    if (r.length > 0) {
      // 根据客户端提交的用户，查询到数据了，说明这个用户名已经被占用了
      res.send({ status: 1, message: '用户名已经被占用了' })
    } else {
      // 说明用户名能够使用
      // 3. 最终目标，添加到数据库user表
      let sql = `insert into user set username='${username}', password='${password}'`;
      db(sql, (err, result) => {
        if (err) throw err;
        // 4. 做出响应
        res.send({ status: 0, message: '注册成功' })
      })
    }
  })
});

/**
 * 登录接口
 * 请求方式：POST
 * 接口地址：/api/login
 * 请求体：username | password
 */
router.post('/login', (req, res) => {
  // console.log(req.body); // { username: 'laotang', password: '123456' }
  let { username, password } = req.body;
  password = md5(password);
  // 使用username和加密的密码当做条件，查询。
  let sql = `select * from user where username='${username}' and password='${password}'`;
  db(sql, (err, result) => {
    if (err) throw err;
    // console.log(result); // 没有查到结果得到空数组；  查到结果得到非空数组
    if (result.length > 0) {
      // 登录成功，生成token
      // 在token中保存用户的id
      // token前必须加 “Bearer ”，注意空格
      let token = 'Bearer ' + jwt.sign({ id: result[0].id }, 'sfsws23s', { expiresIn: '2h' });
      res.send({ status: 0, message: '登录成功', token })
    } else {
      res.send({ status: 1, message: '账号或密码错误' })
    }
  })
});

// 错误处理中间件
router.use((err, req, res, next) => {
  // err 就是前面next过来的参数值
  res.send({ status: 1, message: err })
});

// 4. 导出路由对象（函数）
module.exports = router;